import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'

import { login, getUserInfo, getUserDetailById } from '@/api/user'

import { resetRouter } from '@/router'
const state = {
  // 共享状态
  token: getToken(), // 初始化先查找缓存 是否有token 如果没有为空 有就直接用
  // 共享用户资料
  userInfo: {} // 不需要做持久化管理
}
const mutations = {
  // 更新token
  setToken(state, payload) {
    state.token = payload
    // 同步更新到本地缓存
    setToken(payload)
  },
  // 退出登录时删除token
  removeToken(state) {
    state.token = null
    // 删除本地缓存
    removeToken()
  },

  // 更新用户信息
  setUserInfo(state, payload) {
    // 响应式更新
    state.userInfo = payload
    // 响应式更新
    // state.userInfo = { ...state.userInfo, ...payload }
    // 非响应式更新 只更新对象里面的一个数据
    // state.userInfo['name'] = payload
  },

  // 删除用户信息
  removeUserInfo(state, payload) {
    state.userInfo = {}
  }
}
const actions = {
  // 登录 调用接口 获取token
  async login({ commit }, payload) {
    // 根据传参获取值
    const res = await login(payload)
    // 调用  返回值会默认加一层token res.data.data就是token
    // 在request内设置过响应异常处理和环境变量 后可以直接省略后面的data
    commit('setToken', res)
    // 写入时间戳
    setTimeStamp() // 将当前的最新时间写入缓存
  },

  // 调用接口获取用户信息
  async getUserInfoAction({ commit }) {
    const res = await getUserInfo() // 这个res 就是返回的数据里的data
    const detailResult = await getUserDetailById(res.userId)
    // { ...detailResult, ...res } 把用户信息和用户头像 一起传输过去
    commit('setUserInfo', { ...detailResult, ...res })
    return res // 这里返回的是一个Promise对象   以后使用
  },
  // 登出action  删token 删用户资料
  logout({ commit }) {
    // 删除token
    commit('removeUserInfo')
    // 删除用户信息
    commit('removeToken')
    // 重置路由
    resetRouter() // 重置路由
    // 重置Vuex的路由数据
    // vuex加了命令空间的子模块 怎么调用另外一个子模块
    commit('permission/setRoutes', [], { root: true })
    // 表示root:true commit实际是用顶级调用方式
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
